// 数据库连接配置 - MySQL
const 数据库操作 = require('../zh/后端/数据库操作');
const 进程与系统 = require('../zh/后端/核心/进程与系统');
require('dotenv').config();

// MySQL连接配置
const 连接配置 = {
  host: 进程与系统.获取环境变量('DB_HOST') || 'localhost',
  port: 进程与系统.获取环境变量('DB_PORT') || 3306,
  username: 进程与系统.获取环境变量('DB_USERNAME') || 'root',
  password: 进程与系统.获取环境变量('DB_PASSWORD') || 'aa19960916..',
  database: 进程与系统.获取环境变量('DB_NAME') || 'ipriskscore',
  dialect: 'mysql',
  pool: {
    max: 10,
    min: 0,
    acquire: 30000,
    idle: 10000
  },
  timezone: '+08:00',
  define: {
    timestamps: true,
    freezeTableName: false,
    charset: 'utf8mb4',
    collate: 'utf8mb4_unicode_ci'
  }
};

// 创建数据库连接实例
let 数据库实例 = null;

/**
 * 连接到MySQL数据库
 */
async function 连接数据库() {
  try {
    console.log('正在连接数据库...');
    
    // 使用封装的创建连接函数
    数据库实例 = 数据库操作.创建连接(
      连接配置.database,
      连接配置.username,
      连接配置.password,
      {
        host: 连接配置.host,
        port: 连接配置.port,
        dialect: 连接配置.dialect,
        pool: 连接配置.pool,
        timezone: 连接配置.timezone,
        define: 连接配置.define
      }
    );
    
    // 测试连接
    await 数据库操作.测试连接(数据库实例);
    console.log('数据库连接成功！');
    return true;
  } catch (错误) {
    console.error('数据库连接失败:', 错误.message);
    // 如果连接失败，返回false
    return false;
  }
}

/**
 * 断开数据库连接
 */
async function 断开数据库连接() {
  try {
    if (数据库实例) {
      await 数据库操作.关闭连接(数据库实例);
      console.log('数据库连接已断开');
    }
  } catch (错误) {
    console.error('断开数据库连接失败:', 错误.message);
  }
}

/**
 * 获取数据库连接实例
 */
function 获取数据库实例() {
  return 数据库实例;
}

/**
 * 同步数据库模型
 * @param {boolean} 强制同步 - 是否强制同步（删除并重建表）
 */
async function 同步数据库(强制同步 = false) {
  try {
    if (!数据库实例) {
      throw new Error('数据库实例未初始化');
    }
    
    if (强制同步) {
      console.log('正在强制同步数据库...');
      await 数据库操作.强制同步数据库(数据库实例);
    } else {
      console.log('正在同步数据库...');
      await 数据库操作.同步数据库(数据库实例);
    }
    
    console.log('数据库同步成功');
    return true;
  } catch (错误) {
    console.error('数据库同步失败:', 错误.message);
    return false;
  }
}

module.exports = {
  连接数据库,
  断开数据库连接,
  获取数据库实例,
  同步数据库,
  // 导出Sequelize相关常量
  数据类型: 数据库操作.数据类型,
  操作符: 数据库操作.操作符,
  定义模型: 数据库操作.定义模型
};